﻿#pragma once
#include <map>
#include <mutex>
#include <vector>
#include <atomic>
#include <list>
#include "MarketDataBase.h"
//#include "SymbolsDet.h"
#include "ThostFtdcUserApiDataType.h"
#include "FrameData.h"
#include <functional>
#include "MarketDataStream.h"
#include "KItemGenerator.h"
#include "ThostFtdcUserApiStruct.h"

// 行情数据管理
class MarketDataManager
{
public:
	MarketDataManager();
	~MarketDataManager();

	// 行情更新，只传原始参数
	void UpdateMarket(const std::string &pSymbol, const MData::PriceItem &priceItem);
	// 行情本地保存
	void UpdateLocalKItem(const std::string &pSymbol, const MData::PriceItem &priceItem, MData::KLineItem &lastKItem);
	// 循环等待
	void LoopWait();
	// 设置CTP断开时间
	void SetCTPDisconnectTime(time_t pTime);
	// CTP连接上了
	void ConnectedCTP();
	// 保存并清空最后一根K线
	void SaveTheLastKItem();
private:
	// 缓冲实时行情
	inline void cacheFrameData(FData::FrameKItem &frameItem);
	// 生成1个行情测试数据
	void createTestFrameData();
	// 判断cpt是否断开时间太长了 超过10s了就返回true
	bool checkCTPDistanceLong();
	// 保存最后一根K线，如果长时间没有行情后做这个操作


	std::list<FData::FrameKItem> m_frameItems; // 实时价格数据
	std::mutex m_pricesItemLock; // 价格数据锁

	// 生成K线所需要的
	std::map<std::string, KGen::KItemGenerator> m_kLines; // 保存所有的K线

	MDIO::Price m_priceStream;
	MDIO::KItem m_kItemStream;

	// 记录一个ctp断开时间，如果为0，则证明没有断开
	std::atomic<time_t> m_ctpDisconnectTime;
	// 共享内存失败次数，如果超过10次就退出
	int m_lossSharedMemaryTimes;
};

